// File: event.h
#ifndef  __EVENT_H__
#define  __EVENT_H__

typedef unsigned int IVTNo;
typedef void interrupt (*InterruptHandler)(...);
typedef unsigned int Time;

class KernelEv;

/** 
 * @brief Event je objekat na kome moze biti blokirana nit, a signalizira se
 * prekidom.
 */
class Event {
    public:
        /** 
         * @brief Zamenjuje interrupt rutinu sa rutinom ciju adresu dajemo.
         * 
         * @param IVTNo
         * Broj Prekida.
         * @param InterruptHandler 
         * Adresa funkcije koja ce opsluzivati prekid, obavezno je da zove
         * signal() metodu vlasnickog objekta.
         */
        Event (IVTNo, InterruptHandler);
        /** 
         * @brief Vraca interrupt stanje na staro
         */
        ~Event ();
        /** 
         * @brief Ceka nad dogadjajem neodredjeno(0) ili odredjeno vreme na
         * signal() iz interrupt rutine.
         * 
         * @param time 
         * Vreme koje ce rutina cekati na signal().
         * 0   beskonacno
         * !=0 odredjeno
         * 
         * @return 
         * Isto kao kod Semaphor-a wait-a
         *
         * Samo vlasnik dogadjaja moze na njemu da se blokira!
         */
        int wait  (Time time);
        /** 
         * @brief Odblokira nit koja je blokirana nad dogadjajem i poziva stari
         * handler, sto omogucava da vise niti koristi isti handler.
         */
        void signal();
        /** 
         * @brief Poziva stari handler
         */
        void oldHandler ();  // Simply calls the old handler
    private:
        KernelEv* myImpl;
};

#endif  /*__EVENT_H__*/
